home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / dev / src / mrq_library.lha / lib / examples / asm / cube.s < prev    next >
Text File  |  2000-09-07  |  22KB  |  1,032 lines

  1. ;APS0000069E000000000000000000000000000000000000000000000000000000000000000000000000
  2.     incdir    includes:
  3.  
  4.     include    lvos.i
  5.     include    lvo/mrq_lib.i
  6.     include    exec/exec.i
  7.     include    intuition/intuition.i
  8.  
  9.  
  10. ;proszem nie pszejmowaê siem jenzykiem ;D
  11. ;nie ma to jak Wap :D
  12.  
  13.  
  14. ;--------------------------------------
  15. szer    equ    320
  16. wys    equ    256
  17.  
  18.         rsreset
  19. x        rs.w    1
  20. y        rs.w    1
  21. u        rs.w    1
  22. v        rs.w    1
  23.  
  24. ;--------------------------------------
  25.     section    code,code_p
  26.  
  27.  
  28.  
  29. ;-------                ;alokacja pamiëci na tablice,
  30.     move.l    4,a6            ;bufory
  31.     moveq    #$00,d0
  32.     lea    mrqlib,a1
  33.     jsr    _LVOOpenLibrary(a6)
  34.     move.l    d0,mrqbase
  35.     tst.l    d0
  36.     beq.w    _stupid_error
  37.  
  38.     move.l    #MEMF_FAST+MEMF_CLEAR,d1
  39.     move.l    #(szer*wys)*2,d0
  40.     jsr    _LVOAllocVec(a6)
  41.     tst.l    d0
  42.     beq.w    _stupid_error
  43.     move.l    d0,chunky_buffer
  44.  
  45.     move.l    d0,s_adr1
  46.     add.l    #szer*wys,d0
  47.     move.l    d0,s_adr1e
  48.  
  49.     move.l    #MEMF_FAST+MEMF_CLEAR,d1
  50.     move.l    #(512*10)*4,d0
  51.     jsr    _LVOAllocVec(a6)
  52.     tst.l    d0
  53.     beq.w    _stupid_error
  54.     move.l    d0,lookup
  55.  
  56.     move.l    #MEMF_FAST+MEMF_CLEAR,d1
  57.     move.l    #(65536*4)*2,d0
  58.     jsr    _LVOAllocVec(a6)
  59.     tst.l    d0
  60.     beq.w    _stupid_error
  61.     move.l    d0,multab1
  62.  
  63.     add.l    #65536*4,d0
  64.     move.l    d0,multab
  65.  
  66.     move.l    #MEMF_FAST+MEMF_CLEAR,d1
  67.     move.l    #(16384*4)*2,d0
  68.     jsr    _LVOAllocVec(a6)
  69.     tst.l    d0
  70.     beq.w    _stupid_error
  71.     move.l    d0,right_clip_tab1
  72.     add.l    #16384*4,d0
  73.     move.l    d0,right_clip_tab
  74. ;-------
  75.     move.l    mrqbase,a6
  76.     jsr    _LVOMisterQInit(a6)    ;inicjalizacja biblioteki, struktur
  77.     tst.l    d0
  78.     beq.w    _eext
  79.  
  80.  
  81.     move.l    d0,lib_base
  82.     move.l    lib_base,a5
  83. ;-------                ;zaîadowanie tekstur
  84.     lea    teksturka,a0
  85.     move.l    #MEMF_FAST+MEMF_CLEAR,d0
  86.     jsr    _LVOMLoadFile(a6)
  87.     move.l    d0,texture1
  88.  
  89.     lea    paletka,a0
  90.     move.l    #MEMF_FAST+MEMF_CLEAR,d0
  91.     jsr    _LVOMLoadFile(a6)
  92.     move.l    d0,paleta
  93. ;-------
  94.     move.l    #szer,d0
  95.     move.l    #wys,d1
  96.     moveq    #$00,d2
  97.     move.l    paleta,a0
  98.  
  99.     jsr    _LVOMOpenScreen(a6)    ;otwarcie ekranu
  100.  
  101.  
  102.     tst.l    d0
  103.     beq.w    _ext
  104.     move.l    d0,screenbase
  105.     move.l    d0,a0
  106.     move.l    s_Win_Base(a0),a0
  107.     move.l    wd_UserPort(a0),a0
  108.     move.l    a0,userport
  109.  
  110.     bsr.w    conv_multab
  111.  
  112. loop
  113.  
  114.     bsr.w    ramka
  115.     move.l    d0,-(sp)
  116.  
  117.     jsr    _LVOGetFPS(a6)
  118.     jsr    _LVODecConvert(a6)
  119.     move.l    #0,d0
  120.     move.l    #10,d1
  121.  
  122.     move.l    tabdec2(a5),a0
  123.     jsr    _LVOWyswTXT(a6)
  124.  
  125.  
  126.     move.l    (sp)+,d0
  127.     tst.l    d0
  128.     beq.b    loop    
  129.  
  130.  
  131.  
  132.     move.l    lib_base,a5
  133.     move.l    mrqbase,a6
  134.  
  135.     move.l    screenbase,a0
  136.     jsr    _LVOMCloseScreen(a6)
  137.  
  138.     move.l    paleta,a0
  139.     jsr    _LVOMFreeFile(a6)
  140.     move.l    texture1,a0
  141.     jsr    _LVOMFreeFile(a6)
  142.  
  143. _ext    move.l    lib_base,a0
  144.     jsr    _LVOMisterQCleanUp(a6)    ;zwolnienie struktur,tablic, itp
  145.  
  146. _eext    move.l    4,a6
  147.     move.l    chunky_buffer,a1
  148.     jsr    _LVOFreeVec(a6)
  149.     move.l    lookup,a1
  150.     jsr    _LVOFreeVec(a6)
  151.     move.l    multab1,a1
  152.     jsr    _LVOFreeVec(a6)
  153.     move.l    right_clip_tab1,a1
  154.     jsr    _LVOFreeVec(a6)
  155.     move.l    mrqbase,a1
  156.     jsr    _LVOCloseLibrary(a6)
  157. ;-------
  158. _stupid_error
  159.     moveq    #$00,d0
  160.     rts
  161. ;-------
  162. ramka    bsr.w   cube
  163.  
  164.     move.l    lib_base,a5
  165.     move.l    mrqbase,a6
  166.     move.l    screenbase,a0
  167.     move.l    #szer,d0
  168.     move.l    #wys,d1
  169.     move.l    #0,d2
  170.     move.l    #0,d3
  171.  
  172.     jsr    _LVODoubleBuffer(a6)
  173.  
  174.     move.l    chunky_buffer,a0
  175.     jsr    _LVOC2P(a6)
  176.  
  177.     tst.w    cs
  178.     bne.b    _no_cs
  179.  
  180.     move.l    #(szer*wys)/32,d0    ;czyszczenie bufora chunky
  181.     move.l    chunky_buffer,a0
  182. kk    clr.l    (a0)+
  183.     clr.l    (a0)+
  184.     clr.l    (a0)+
  185.     clr.l    (a0)+
  186.     clr.l    (a0)+
  187.     clr.l    (a0)+
  188.     clr.l    (a0)+
  189.     clr.l    (a0)+
  190.     dbf    d0,kk
  191.  
  192. _no_cs
  193.  
  194.     move.l    userport,a0
  195.     jsr    _LVOGetDynamicMessage(a6)
  196.     move.l    d0,a0
  197.     move.l    im_Class(a0),d0
  198.     cmp.l    #IDCMP_RAWKEY,d0
  199.     beq.b    _key1
  200.     moveq    #$00,d0
  201.     rts
  202. _key1    
  203.     move.w    im_Code(a0),d0
  204.     and.l    #$000000ff,d0
  205.     cmp.b    #95,d0        ;wyjôcie przez HELP
  206.     beq.b    _cs_sc
  207.     cmp.b    #80,d0        ;f1 - wîâczenie/wyîâczenie czyszczenia
  208.     bne.b    _clear
  209.     eor.w    #$ff,cs
  210. _clear
  211.     moveq    #$00,d0
  212.     rts
  213. _cs_sc    moveq    #$01,d0
  214.     rts
  215. ;-------
  216. conv_multab
  217.     move.l    multab,a0
  218.     move.l    multab,a1
  219.     move.l    #65536-2,d7
  220.     move.l    #65535/1,d0
  221.     moveq.l    #1,d2
  222.  
  223.     move.l    #0,(a0)+
  224.     move.l    #0,-(a1)
  225.  
  226. .lp    move.l    d0,d1
  227.     divs.l    d2,d1
  228.     move.l    d1,(a0)+
  229.     move.l    d1,-(a1)
  230.     addq.l    #1,d2
  231.     dbf    d7,.lp
  232.  
  233.                             ;tutaj generuje tablelke
  234.                             ;do obcinania do bocznych
  235.                             ;ramek
  236.         move.l    right_clip_tab,a0
  237.         sub.l    #(8000*2),a0
  238.         moveq    #-1,d0                ;tutaj konkretnie do prawej
  239.         move.w    #8000-1,d7
  240. fill_clip_tab_1    move.w    d0,(a0)+            ;tutaj "trafimy" z x'em ujemnym
  241.         dbf    d7,fill_clip_tab_1
  242.  
  243.         move.l    right_clip_tab,a0        ;a tutaj nie obcinamy...
  244.         moveq    #0,d0
  245.         move.w    #szer-1,d7
  246. fill_clip_tab_2    move.w    d0,(a0)+
  247.         addq.w    #1,d0
  248.         dbf    d7,fill_clip_tab_2
  249.  
  250.         move.w    #szer,d0            ;a tutaj to juz wyszlismy
  251.         move.w    #8000*2-1,d7            ;poza prawom ramke i
  252. fill_clip_tab_3    move.w    d0,(a0)+            ;juz nie musimy rysowac
  253.         dbf    d7,fill_clip_tab_3        ;linii...
  254.  
  255.     rts
  256. ;-------
  257. cube
  258.  
  259.     bsr.w    obroty
  260.  
  261. lo1    =    -$400
  262. hi1    =    $400
  263.  
  264.     move.l    #lo1,d0
  265.     move.l    #lo1,d1
  266.     move.l    #lo1,d2
  267.     bsr.w    obrot
  268.     move.w    d0,x1
  269.     move.w    d1,y1
  270.  
  271.     move.l    #lo1,d0
  272.     move.l    #hi1,d1
  273.     move.l    #lo1,d2
  274.     bsr.w    obrot
  275.     move.w    d0,x2
  276.     move.w    d1,y2
  277.  
  278.     move.l    #hi1,d0
  279.     move.l    #hi1,d1
  280.     move.l    #lo1,d2
  281.     bsr.w    obrot
  282.     move.w    d0,x3
  283.     move.w    d1,y3
  284.  
  285.  
  286.     move.w    #1,u1
  287.     move.w    #1,v1
  288.     move.w    #1,u2
  289.     move.w    #256/2-1,v2
  290.     move.w    #256/2-1,u3
  291.     move.w    #256/2-1,v3
  292.     move.l    texture1,a4
  293.     bsr.w    triage
  294.  
  295.     move.l    #hi1,d0
  296.     move.l    #hi1,d1
  297.     move.l    #lo1,d2
  298.     bsr.w    obrot
  299.     move.w    d0,x1
  300.     move.w    d1,y1
  301.  
  302.     move.l    #hi1,d0
  303.     move.l    #lo1,d1
  304.     move.l    #lo1,d2
  305.     bsr.w    obrot
  306.     move.w    d0,x2
  307.     move.w    d1,y2
  308.  
  309.     move.l    #lo1,d0
  310.     move.l    #lo1,d1
  311.     move.l    #lo1,d2
  312.     bsr.w    obrot
  313.     move.w    d0,x3
  314.     move.w    d1,y3
  315.  
  316.  
  317.     move.w    #256/2-1,u1
  318.     move.w    #256/2-1,v1
  319.     move.w    #256/2-1,u2
  320.     move.w    #1,v2
  321.     move.w    #1,u3
  322.     move.w    #1,v3
  323.     move.l    texture1,a4
  324. ;------
  325. triage
  326.  
  327.     lea    x1,a0
  328.     lea    x2,a1
  329.     lea    x3,a2
  330.  
  331.         move.l    a4,_2_map    ;zapisz wskaznik textury
  332.  
  333.         move.w    y(a2),d0    ;sortujemy punkty wzgledem y
  334.         cmp.w    y(a0),d0
  335.         bge.b    .swap_1
  336.         exg.l    a2,a0
  337. .swap_1:    move.w    y(a2),d0
  338.         cmp.w    y(a1),d0
  339.         bge.b    .swap_2
  340.         exg.l    a2,a1
  341. .swap_2:    move.w    y(a1),d0
  342.         cmp.w    y(a0),d0
  343.         bge.b    .swap_3
  344.         exg.l    a1,a0
  345. .swap_3:
  346.         move.w    y(a0),d0    ;jesli y1=y1 to skoryguj
  347.         cmp.w    y(a1),d0    ;y2 i y3 (to przez to ze
  348.         bne.b     _dd        ;mam jakis blad niedokladnosci
  349.         addq.w    #1,y(a1)    ;w procedurze. ogolnie to bardzo
  350.         addq.w    #1,y(a2)    ;brzydko to zalatwilem
  351. _dd
  352.         move.w    x(a0),d0    ;y1=y1 ?
  353.         cmp.w    x(a1),d0
  354.         bne.b    _eed        ;jesli tak to sprobuj kontynuowac
  355.         cmp.w    x(a2),d0    ;y1=y2=y3?
  356.         beq.b    _ee        ;to olej ten trojkont!
  357. _eed
  358.  
  359.     ;teraz licze najdluzszom linie w trujkoncie
  360.     ;po jej znaku bede wiedzial z ktorej strony
  361.     ;jest najdluzsza linie i co z tego wynika
  362.     ;bede mogl wywalic sprawdzanie w innerlopie
  363.     ;czy x1>x2 bo zrobie to przed pentlom
  364.     ;patrz:)
  365.  
  366. ;-----------------------------------------------------
  367. ;              (y2-y1) << 16
  368. ;       temp = --------------
  369. ;                  y3-y1
  370. ;
  371. ;       width = temp * (x3-x1) + ((x1-x2) << 16)
  372. ;-----------------------------------------------------
  373.         move.w    y(a2),d1        ;y3-y1=0
  374.         sub.w    y(a0),d1
  375.         bne.b    mgo_one
  376.  
  377. _ee                        ;jesli tak to do widzienia...
  378.         rts
  379. mgo_one
  380.         moveq    #16,d2            ;ustaw "wirtualny przecinek"
  381.         move.w    y(a1),d0        ;(y2-y1)
  382.         sub.w    y(a0),d0
  383.         ext.l    d0
  384.         asl.l    d2,d0            ;(y2-y1)*65536
  385.         ext.l    d1
  386.         divs.l    d1,d0            ;[(y2-y1)*65536]/(y3-y1)
  387.  
  388.         move.w    x(a2),d4        ;(x2-x1)
  389.         sub.w    x(a0),d4
  390.         ext.l    d4
  391.         muls.l    d0,d4            ;{[(y2-y1)*65536]/(y3-y1)}*(x2-x1)
  392.  
  393.         move.w    x(a0),d3        ;(x1-x2)
  394.         sub.w    x(a1),d3
  395.         ext.l    d3
  396.         asl.l    d2,d3            ;(x1-x2)*65536
  397.         add.l    d4,d3            ;{[(y2-y1)*65536]/(y3-y1)}*(x2-x1)+(x1-x2)*65536  - uffff...
  398.  
  399.         move.l    d3,longest        ;ok tutaj mamy najdluzszom linie * 65536!
  400.  
  401.         move.l    multab,a6        ;przygotuj tablice dzielenia
  402.  
  403.         swap.w    d3            ;czesc calkowita najdluzszej linii
  404.         tst.w    d3            ;zbadaj...
  405.         beq.w    map_exit        ;zero? to wypierdalaj
  406.  
  407.         bpl.w    _right            ;dodatnia? to z prawej strony
  408.  
  409.  
  410.     ;ok tutaj lecom procedurki ktore obliczajom
  411.     ;przyrosty dla textur i krawendzi trujkonta
  412.     ;som dwie dlatego, ze w zaleznosci od znaku
  413.     ;najdluzszej linii wiemy z ktorej strony zn-
  414.     ;ajduje sie najdluzsza krawedz wiec wiemy
  415.     ;gdzie mozemy sobie odpuscic interpolowanie
  416.     ;przyrostu textury, bo przy stalych przyrostach
  417.     ;musimy interpolowac tylko z jednej krawendzi
  418.     ;- tej po prawej!!! Przy okazji mam za darmo
  419.     ;test czy x2<x1...
  420.  
  421. ;-----------------------------------------------------
  422. ;    longest edge (a2,a0) on the left 
  423.  
  424.         move.w    x(a1),d0        ;przyrost 1
  425.         sub.w    x(a0),d0
  426.         move.w    y(a1),d1
  427.         sub.w    y(a0),d1
  428.         ext.l    d0
  429.         muls.l    (a6,d1.w*4),d0        ;podziel!! (to tak jak -> divs d1.w,d0.l)
  430.         ;asl.l    #2,d0
  431.         move.l    d0,right_dx1    ;kod samomodyfikujacy sie!!!!!
  432.  
  433.         move.w    x(a2),d0        ;przyrost 2
  434.         sub.w    x(a1),d0
  435.         move.w    y(a2),d1
  436.         sub.w    y(a1),d1
  437.         ext.l    d0
  438.         muls.l    (a6,d1.w*4),d0
  439.         ;asl.l    #2,d0
  440.         move.l    d0,right_dx2
  441.         
  442.         move.w    x(a2),d0        ;przyrost 3
  443.         sub.w    x(a0),d0
  444.         move.w    y(a2),d1
  445.         sub.w    y(a0),d1
  446.         ext.l    d0
  447.         muls.l    (a6,d1.w*4),d0
  448.         ;asl.l    #2,d0
  449.         move.l    d0,left_dx1
  450.         move.l    d0,left_dx2
  451.  
  452.         *******************
  453.         move.w    u(a2),d0        ;przyrosty textury [u]
  454.         sub.w    u(a0),d0
  455.         ext.l    d0
  456.         muls.l    (a6,d1.w*4),d0
  457.         ;asl.l    #2,d0
  458.         move.l    d0,left_du1
  459.         move.l    d0,left_du2
  460.  
  461.         move.w    v(a2),d0        ;[v]
  462.         sub.w    v(a0),d0
  463.         ext.l    d0
  464.         muls.l    (a6,d1.w*4),d0
  465.         ;asl.l    #2,d0
  466.         move.l    d0,left_dv1
  467.         move.l    d0,left_dv2
  468.  
  469.         bra    cdeltas
  470. ;-----------------------------------------------------
  471. ;    longest edge (a2,a0) on the right
  472.  
  473. _right:                        ;to samo tylko dla drugiego przypadku!
  474.         move.w    x(a1),d0
  475.         sub.w    x(a0),d0
  476.         move.w    y(a1),d1
  477.         sub.w    y(a0),d1
  478.         ext.l    d0
  479.         muls.l    (a6,d1.w*4),d0
  480.         ;asl.l    #2,d0
  481.         move.l    d0,left_dx1         
  482.         move.l    d1,d6
  483.  
  484.         move.w    x(a2),d0
  485.         sub.w    x(a1),d0
  486.         move.w    y(a2),d1
  487.         sub.w    y(a1),d1
  488.         ext.l    d0
  489.         muls.l    (a6,d1.w*4),d0
  490.         ;asl.l    #2,d0
  491.         move.l    d0,left_dx2
  492.         move.l    d1,d7
  493.  
  494.         move.w    x(a2),d0
  495.         sub.w    x(a0),d0
  496.         move.w    y(a2),d1
  497.         sub.w    y(a0),d1
  498.         ext.l    d0
  499.         muls.l    (a6,d1.w*4),d0
  500.         ;asl.l    #2,d0
  501.         move.l    d0,right_dx1
  502.         move.l    d0,right_dx2
  503.  
  504.         *******************
  505.         move.w    u(a1),d0
  506.         sub.w    u(a0),d0
  507.         ext.l    d0
  508.         muls.l    (a6,d6.w*4),d0
  509.         ;asl.l    #2,d0
  510.         move.l    d0,left_du1
  511.  
  512.         move.w    u(a2),d0
  513.         sub.w    u(a1),d0
  514.         ext.l    d0
  515.         muls.l    (a6,d7.w*4),d0
  516.         ;asl.l    #2,d0
  517.         move.l    d0,left_du2
  518.  
  519.         move.w    v(a1),d0
  520.         sub.w    v(a0),d0
  521.         ext.l    d0
  522.         muls.l    (a6,d6.w*4),d0
  523.         ;asl.l    #2,d0
  524.         move.l    d0,left_dv1
  525.  
  526.         move.w    v(a2),d0
  527.         sub.w    v(a1),d0
  528.         ext.l    d0
  529.         muls.l    (a6,d7.w*4),d0
  530.         ;asl.l    #2,d0
  531.         move.l    d0,left_dv2        
  532.  
  533.  
  534.     ;tutaj to co czyni te procedurke w miare
  535.     ;szybkom - stale delty dla interpolacji
  536.     ;textury wewnatrz trujkonta [ponizej wzor]
  537.     ;musimy go policzyc dwa razy bo mamy [U,V]
  538.  
  539. ;-----------------------------------------------------
  540. ;        Calculate constant deltas
  541. ;        
  542. ;          (At-Ct)*(By-Cy) - (Bt-Ct)*(Ay-Cy)
  543. ;  dt/dx = ---------------------------------
  544. ;          (Ax-Cx)*(By-Cy) - (Bx-Cx)*(Ay-Cy)    ;<-mianownik jest taki sam dla obu delt [dzieki bogu:)]
  545. ;
  546. ;-----------------------------------------------------
  547. cdeltas:    ;calc dcu
  548.  
  549.         move.w    u(a0),d0
  550.         sub.w    u(a2),d0
  551.         move.w    y(a1),d1
  552.         sub.w    y(a2),d1
  553.         muls    d1,d0        ;(At-Ct)*(By-Cy)
  554.                 
  555.         move.w    u(a1),d1
  556.         sub.w    u(a2),d1
  557.         move.w    y(a0),d2
  558.         sub.w    y(a2),d2        
  559.         muls    d2,d1        ;(Bt-Ct)*(Ay-Cy)
  560.         sub.l    d1,d0
  561.  
  562.         move.w    x(a0),d3
  563.         sub.w    x(a2),d3
  564.         move.w    y(a1),d1
  565.         sub.w    y(a2),d1
  566.         muls    d1,d3        ;(Ax-Cx)*(By-Cy)
  567.  
  568.         move.w    x(a1),d1
  569.         sub.w    x(a2),d1
  570.         move.w    y(a0),d2
  571.         sub.w    y(a2),d2        
  572.         muls    d2,d1        ;(Bx-Cx)*(Ay-Cy)
  573.         sub.l    d1,d3
  574.  
  575.         asl.l    #8,d0
  576.         ;asl.l    #2,d0
  577.         divs.l    d3,d0
  578.         asl.l    #8,d0
  579.         ;asl.l    #8-2,d0
  580.         move.l    d0,dcu        ;stale U
  581.     
  582.         move.w    v(a0),d0
  583.         sub.w    v(a2),d0
  584.         move.w    y(a1),d1
  585.         sub.w    y(a2),d1
  586.         muls    d1,d0        ;(At-Ct)*(By-Cy)
  587.                 
  588.         move.w    v(a1),d1
  589.         sub.w    v(a2),d1
  590.         move.w    y(a0),d2
  591.         sub.w    y(a2),d2        
  592.         muls    d2,d1        ;(Bt-Ct)*(Ay-Cy)
  593.         sub.l    d1,d0
  594.  
  595.         asl.l    #8,d0
  596.         ;asl.l    #2,d0
  597.         divs.l    d3,d0
  598.         asl.l    #8,d0    
  599.         ;asl.l    #8-2,d0    
  600.         move.l    d0,dcv        ;stale V
  601. ;-----------------------------------------------------
  602. ;    teraz licze tablice interpolacji wewnatrz
  603. ;    trujkonta, skoro U,V jest stale to moge
  604. ;    calom interpolacje przeliczyc i wjebac do
  605. ;    tabelki!!!!
  606.  
  607.         moveq    #0,d0
  608.         moveq    #0,d1
  609.         move.l    longest(pc),d2        ;tabelka musi miec dlugosc
  610.         swap.w    d2            ;najdluzszej linii!!!
  611.         tst.w    d2
  612.         bpl.b    len_ok
  613.         neg.w    d2
  614. len_ok        move.l    lookup,a4        
  615.         addq.w    #8,d2
  616. look_up:    
  617.         move.l    d1,d5        ;tutaj to co bym robil w innerlopie
  618.         asr.l    #8,d5
  619.         move.l    d0,d3
  620.         swap.w    d3
  621.         move.b    d3,d5
  622.  
  623.         move.w    d5,(a4)+    ;zapisz do tablicy!!
  624.  
  625.         add.l    dcu(pc),d0    ;dodaj przyrosty [U]
  626.         add.l    dcv(pc),d1    ;         [V]
  627.         dbf    d2,look_up
  628. ;-----------------------------------------------------
  629.         moveq    #16,d6            ;"wirtualny" przecinek
  630.  
  631.         ;ustaw poczontkowe wartosci x,u,v
  632.         ;(do nich bedziemy dodawac przyrosty!)
  633.  
  634.         move.w    x(a0),d0        ;setup start x,u,v
  635.         lsl.l    d6,d0
  636.         move.l    d0,left_x
  637.         move.l    d0,right_x        ;x ustawione
  638.         
  639.         move.w    u(a0),d0
  640.         lsl.l    d6,d0
  641.         move.l    d0,left_u        ;teraz u
  642.  
  643.         move.w    v(a0),d0
  644.         lsl.l    d6,d0
  645.         move.l    d0,left_v        ;i v
  646.  
  647.  
  648.         ;oblicz pierwsza linie trujkonta
  649.  
  650.         move.l    chunky_buffer,a6    ;pobierz ze stosu adres ekranu
  651.         move.w    y(a0),d0        ;y1->d0
  652.         ext.l    d0
  653.         muls.w    #szer,d0        ;y1*368+screen (start y)
  654.         add.l    d0,a6
  655. ;------------------------------------------------------------------        
  656.         moveq    #16,d6        ;"wirtualny" przecinek:)
  657.  
  658.         ;oblicz wysokosci poszczegolnych sekcji trojkonta
  659.  
  660.         move.w    y(a2),d0        ;h2
  661.         sub.w    y(a1),d0
  662.         swap.w    d0
  663.  
  664.         move.w    y(a1),d0        ;h1
  665.         sub.w    y(a0),d0
  666.  
  667.         lea    left_x(pc),a0
  668.         move.l    right_clip_tab,a1
  669.     
  670.         subq.w    #1,d0        ;jesli sekcja 1 ma h=0 to rysuj od drugiej!!
  671.         bmi.w    _h2
  672. ;------------------------------------------------------------------
  673. ;        a1,a2
  674.  
  675.     ;no to jazda mozemy rysowac!!!!!!!!!!!!!!
  676.  
  677. h1        cmp.l    s_adr1(pc),a6        ;obetnij do gornej ramki!
  678.         blt.b    h1_next_line    
  679.         cmp.l    s_adr1e(pc),a6        ;obetnij do dolnej ramki!!
  680.         bge.w    map_exit
  681.     
  682.         movem.l    (a0),d1-d2    ;left_x i right_x do rejestrow
  683.  
  684.         asr.l    d6,d1        ;czesc calkowita!!
  685.         asr.l    d6,d2
  686.  
  687.         cmp.w    #szer,d1    ;czy x1>szer? jesli tak to nie rysuj linii
  688.         bgt.b    h1_next_line
  689.  
  690.         move.l    lookup,a3    ;tabela interpolacji do a3
  691.  
  692.         tst.w    d1        ;czy x1 ukemny?
  693.         bpl.b    ok_cmp_1    ;nie.
  694.         neg.w    d1        ;tak. no to zmien znak!
  695.         move.w    d1,d3
  696.         ;asr.w    d3
  697.         lea    (a3,d3.w*2),a3    ;adres poczontkowy w tablicy
  698.         moveq    #0,d1        ;x1 = 0
  699.  
  700. ok_cmp_1        
  701.         move.w    (a1,d2.w*2),d2    ;obetnij x2 (korzystajac z tabelki)
  702.         bmi.b    h1_next_line    ;nastempna linia
  703.  
  704.         sub.w    d1,d2        ;dlugosc linii (x2-x1)
  705.         ;asr.w    d2
  706.         bmi.b    h1_next_line
  707.     
  708.         moveq    #0,d4        ;teraz pobierz wartosci [U,V]
  709.         move.b    left_v+1(pc),d4    ;na krawedziach textury
  710.         lsl.w    #8,d4        ;zformuj jednom wartosc w d4
  711.         move.b    left_u+1(pc),d4    ; d4=$0000vvuu
  712.         
  713.         lea    (a6,d1.w*1),a5    ;adres pierwszego pixela linii na ekranie
  714.  
  715.         move.l    _2_map(pc),a4    ;adres textury -> a4
  716.  
  717.         lea    (a4,d4.l*2),a4    ;dodaj ofset do adresu textury
  718.  
  719.         moveq    #0,d5        ;d5=0
  720.  
  721. h1_inner    move.w    (a3)+,d5    ;pobierz przeliczonom interpolacje
  722.         move.b    (a4,d5.w*2),(a5)+ ;pobierz i postaw pixel!
  723.         ;move.b    #-1,(a5)+ ;pobierz i postaw pixel!
  724.         dbf    d2,h1_inner
  725. h1_next_line    
  726.  
  727.  
  728.     move.l    (a0),d7
  729.     add.l    left_dx1,d7
  730.     move.l    d7,(a0)
  731.  
  732.     move.l    4(a0),d7
  733.     add.l    right_dx1,d7
  734.     move.l    d7,4(a0)    ;dodaj przyrost do x2
  735.  
  736.     move.l    8(a0),d7
  737.     add.l    left_du1,d7    ;dodaj przyrost do U
  738.     move.l    d7,8(a0)
  739.  
  740.     move.l    12(a0),d7
  741.     add.l    left_dv1,d7    ;dodaj przyrost do V
  742.     move.l    d7,12(a0)
  743.  
  744.  
  745.         add.w    #szer,a6        ;nastempna linia
  746.         dbf    d0,h1        ;puki h!=0
  747.  
  748.  
  749.  
  750. ;-------        
  751. ;    wszystko ponizej jest identyczne jak przed chwilom
  752. ;-------        
  753.  
  754.  
  755. _h2        
  756.         swap.w    d0
  757.         tst.w    d0
  758.         bmi.w    map_exit
  759.  
  760. h2        cmp.l    s_adr1(pc),a6
  761.         blt.b    h2_next_line    
  762.         cmp.l    s_adr1e(pc),a6
  763.         bge.w    map_exit
  764.  
  765.         movem.l    (a0),d1-d2
  766.     
  767.         asr.l    d6,d1
  768.         asr.l    d6,d2
  769.         
  770.         cmp.w    #szer,d1
  771.         bgt.b    h2_next_line
  772.  
  773.         move.l    lookup,a3
  774.  
  775.         tst.w    d1        ;left clip
  776.         bpl.b    ok_cmp_2
  777.         neg.w    d1
  778.         move.w    d1,d3
  779.         ;asr.w    d3
  780.         lea    (a3,d3.w*2),a3
  781.         moveq    #0,d1
  782. ok_cmp_2    
  783.         move.w    (a1,d2.w*2),d2    ;right clip
  784.         bmi.b    h2_next_line
  785.  
  786.         sub.w    d1,d2
  787.         ;asr.w    d2
  788.         bmi.b    h2_next_line
  789.  
  790.         moveq    #0,d4
  791.         move.b    left_v+1(pc),d4
  792.         lsl.w    #8,d4
  793.         move.b    left_u+1(pc),d4
  794.  
  795.         lea    (a6,d1.w*1),a5
  796.         
  797.         move.l    _2_map(pc),a4
  798.  
  799.         lea    (a4,d4.l*2),a4
  800.  
  801.         moveq    #0,d5
  802.     
  803. h2_inner    move.w    (a3)+,d5      ;5  cykli na 020
  804.         move.b    (a4,d5.w*2),(a5)+ ;10
  805.         ;move.b    #-1,(a5)+ ;10
  806.         dbf    d2,h2_inner      ;6
  807.                     ;21 clock ticks.
  808. h2_next_line    
  809.  
  810.  
  811.     move.l    (a0),d7
  812.     add.l    left_dx2,d7
  813.     move.l    d7,(a0)
  814.  
  815.     move.l    4(a0),d7
  816.     add.l    right_dx2,d7
  817.     move.l    d7,4(a0)    ;dodaj przyrost do x2
  818.  
  819.     move.l    8(a0),d7
  820.     add.l    left_du2,d7    ;dodaj przyrost do U
  821.     move.l    d7,8(a0)
  822.  
  823.     move.l    12(a0),d7
  824.     add.l    left_dv2,d7    ;dodaj przyrost do V
  825.     move.l    d7,12(a0)
  826.  
  827.  
  828.  
  829.         add.w    #szer,a6        ;nastempna linia
  830.         dbf    d0,h2
  831.  
  832. map_exit    rts
  833.  
  834. ;------
  835. obroty
  836.  
  837.  
  838.     lea    sin,a1
  839.     lea    cos,a2
  840.  
  841.     add.l    #2,alfa
  842.     add.l    #-2,beta
  843.     add.l    #2,gamma
  844.  
  845.     and.l    #$ff,alfa
  846.     and.l    #$ff,beta
  847.     and.l    #$ff,gamma
  848.     move.l    alfa,d0
  849.     move.l    beta,d1        
  850.     move.l    gamma,d2        
  851.     move.w    (a1,d0.w*2),sinalf    
  852.     move.w    (a2,d0.w*2),cosalf    
  853.     move.w    (a1,d1.w*2),sinbet    
  854.     move.w    (a2,d1.w*2),cosbet    
  855.     move.w    (a1,d2.w*2),singam
  856.     move.w    (a2,d2.w*2),cosgam    
  857.  
  858.     rts
  859. ;--------------------------------------
  860.  
  861. obrot
  862.  
  863.     move.w    d1,d3
  864.     move.w    d2,d4
  865.     muls.w    cosalf,d1
  866.     muls.w    sinalf,d4
  867.     muls.w    sinalf,d3
  868.     muls.w    cosalf,d2
  869.     sub.l    d4,d1
  870.     add.l    d3,d2
  871.     asr.l    #8,d1
  872.     asr.l    #8,d2
  873.  
  874.     move.w    d0,d3
  875.     move.w    d2,d4
  876.     muls.w    cosbet,d0
  877.     muls.w    sinbet,d4
  878.     muls.w    sinbet,d3
  879.     muls.w    cosbet,d2
  880.     sub.l    d4,d0
  881.     add.l    d3,d2
  882.     asr.l    #8,d0
  883.     asr.l    #8,d2
  884.  
  885.     move.w    d0,d3
  886.     move.w    d1,d4
  887.     muls.w    cosgam,d0
  888.     muls.w    singam,d4
  889.     muls.w    singam,d3
  890.     muls.w    cosgam,d1
  891.     sub.l    d4,d0
  892.     add.l    d3,d1
  893.     asr.l    #8,d0
  894.     asr.l    #8,d1
  895.  
  896.     move.l    d2,d3
  897.     add.l    #$1000,d2
  898.     asl.l    #8,d0    
  899.     asl.l    #8,d1    
  900.     tst    d2
  901.     bne.b    .zr1
  902.     addq    #1,d2
  903. .zr1    
  904.     divs.w    d2,d0
  905.     divs.w    d2,d1
  906.     add.w    #160,d0
  907.     add.w    #100,d1
  908.  
  909.     move.b    d3,d2
  910.     lsr.l    #3,d2
  911.     add.b    #$80,d2
  912.     not.b    d2
  913.     rts
  914. ;-------
  915. paleta        dc.l    $00
  916. texture1    dc.l    $00
  917. chunky_buffer    dc.l    $00
  918. userport    dc.l    $00
  919. left_dx1    dc.l    $00    ;dodaj przyrost do x1
  920. right_dx1    dc.l    $00    ;dodaj przyrost do x2
  921. left_du1    dc.l    $00    ;dodaj przyrost do U
  922. left_dv1    dc.l    $00    ;dodaj przyrost do V
  923. left_dx2    dc.l    $00    ;dodaj przyrost do x1
  924. right_dx2    dc.l    $00    ;dodaj przyrost do x2
  925. left_du2    dc.l    $00    ;dodaj przyrost do U
  926. left_dv2    dc.l    $00    ;dodaj przyrost do V
  927. s_adr1        dc.l    $00
  928. s_adr1e        dc.l    $00
  929. lookup        dc.l    $00
  930. multab1        dc.l    $00
  931. multab        dc.l    $00
  932. alfa        dc.l    $00
  933. beta        dc.l    $00
  934. gamma        dc.l    $00
  935. sinalf        dc.w    $00
  936. cosalf        dc.w    $00
  937. sinbet        dc.w    $00
  938. cosbet        dc.w    $00
  939. singam        dc.w    $00
  940. cosgam        dc.w    $00
  941. mrqbase        dc.l    $00
  942. lib_base    dc.l    $00
  943. screenbase    dc.l    $00
  944. right_clip_tab1    dc.l    $00
  945. right_clip_tab    dc.l    $00
  946. ;-------
  947. x1        ds.w    $01
  948. y1        ds.w    $01
  949. u1        ds.w    $01
  950. v1        ds.w    $01
  951. x2        ds.w    $01
  952. y2        ds.w    $01
  953. u2        ds.w    $01
  954. v2        ds.w    $01
  955. x3        ds.w    $01
  956. y3        ds.w    $01
  957. u3        ds.w    $01
  958. v3        ds.w    $01
  959. sav_sp        dc.l    $00
  960. longest        dc.l    $00
  961. left_x        dc.l    $00
  962. right_x        dc.l    $00
  963. left_u        dc.l    $00
  964. left_v        dc.l    $00
  965. dcu        dc.l    $00
  966. dcv        dc.l    $00
  967. zn        dc.b    $00
  968. cs        dc.w    $00
  969. _2_map        ds.l    1
  970. ;-------
  971. teksturka    dc.b    'gfx:edify_256x256.chunky',0
  972. paletka        dc.b    'gfx:edify_256x256.palete',0
  973. ;-------
  974. mrqlib        dc.b    'mrq.library',0
  975. ;-------
  976. sin    DC.W    $0000,$0006,$000C,$0012,$0019,$001F,$0025,$002B,$0031,$0038
  977.     DC.W    $003E,$0044,$004A,$0050,$0056,$005C,$0061,$0067,$006D,$0073
  978.     DC.W    $0078,$007E,$0083,$0088,$008E,$0093,$0098,$009D,$00A2,$00A7
  979.     DC.W    $00AB,$00B0,$00B5,$00B9,$00BD,$00C1,$00C5,$00C9,$00CD,$00D1
  980.     DC.W    $00D4,$00D8,$00DB,$00DE,$00E1,$00E4,$00E7,$00EA,$00EC,$00EE
  981.     DC.W    $00F1,$00F3,$00F4,$00F6,$00F8,$00F9,$00FB,$00FC,$00FD,$00FE
  982.     DC.W    $00FE,$00FF,$00FF,$00FF,$0100,$00FF,$00FF,$00FF,$00FE,$00FE
  983.     DC.W    $00FD,$00FC,$00FB,$00F9,$00F8,$00F6,$00F4,$00F3,$00F1,$00EE
  984.     DC.W    $00EC,$00EA,$00E7,$00E4,$00E1,$00DE,$00DB,$00D8,$00D4,$00D1
  985.     DC.W    $00CD,$00C9,$00C5,$00C1,$00BD,$00B9,$00B5,$00B0,$00AB,$00A7
  986.     DC.W    $00A2,$009D,$0098,$0093,$008E,$0088,$0083,$007E,$0078,$0073
  987.     DC.W    $006D,$0067,$0061,$005C,$0056,$0050,$004A,$0044,$003E,$0038
  988.     DC.W    $0031,$002B,$0025,$001F,$0019,$0012,$000C,$0006,$0000,$FFFA
  989.     DC.W    $FFF4,$FFEE,$FFE7,$FFE1,$FFDB,$FFD5,$FFCF,$FFC8,$FFC2,$FFBC
  990.     DC.W    $FFB6,$FFB0,$FFAA,$FFA4,$FF9F,$FF99,$FF93,$FF8D,$FF88,$FF82
  991.     DC.W    $FF7D,$FF78,$FF72,$FF6D,$FF68,$FF63,$FF5E,$FF59,$FF55,$FF50
  992.     DC.W    $FF4B,$FF47,$FF43,$FF3F,$FF3B,$FF37,$FF33,$FF2F,$FF2C,$FF28
  993.     DC.W    $FF25,$FF22,$FF1F,$FF1C,$FF19,$FF16,$FF14,$FF12,$FF0F,$FF0D
  994.     DC.W    $FF0C,$FF0A,$FF08,$FF07,$FF05,$FF04,$FF03,$FF02,$FF02,$FF01
  995.     DC.W    $FF01,$FF01,$FF00,$FF01,$FF01,$FF01,$FF02,$FF02,$FF03,$FF04
  996.     DC.W    $FF05,$FF07,$FF08,$FF0A,$FF0C,$FF0D,$FF0F,$FF12,$FF14,$FF16
  997.     DC.W    $FF19,$FF1C,$FF1F,$FF22,$FF25,$FF28,$FF2C,$FF2F,$FF33,$FF37
  998.     DC.W    $FF3B,$FF3F,$FF43,$FF47,$FF4B,$FF50,$FF55,$FF59,$FF5E,$FF63
  999.     DC.W    $FF68,$FF6D,$FF72,$FF78,$FF7D,$FF82,$FF88,$FF8D,$FF93,$FF99
  1000.     DC.W    $FF9F,$FFA4,$FFAA,$FFB0,$FFB6,$FFBC,$FFC2,$FFC8,$FFCF,$FFD5
  1001.     DC.W    $FFDB,$FFE1,$FFE7,$FFEE,$FFF4,$FFFA
  1002. cos    DC.W    $0100,$00FF,$00FF,$00FF,$00FE,$00FE,$00FD,$00FC,$00FB,$00F9
  1003.     DC.W    $00F8,$00F6,$00F4,$00F3,$00F1,$00EE,$00EC,$00EA,$00E7,$00E4
  1004.     DC.W    $00E1,$00DE,$00DB,$00D8,$00D4,$00D1,$00CD,$00C9,$00C5,$00C1
  1005.     DC.W    $00BD,$00B9,$00B5,$00B0,$00AB,$00A7,$00A2,$009D,$0098,$0093
  1006.     DC.W    $008E,$0088,$0083,$007E,$0078,$0073,$006D,$0067,$0061,$005C
  1007.     DC.W    $0056,$0050,$004A,$0044,$003E,$0038,$0031,$002B,$0025,$001F
  1008.     DC.W    $0019,$0012,$000C,$0006,$0000,$FFFA,$FFF4,$FFEE,$FFE7,$FFE1
  1009.     DC.W    $FFDB,$FFD5,$FFCF,$FFC8,$FFC2,$FFBC,$FFB6,$FFB0,$FFAA,$FFA4
  1010.     DC.W    $FF9F,$FF99,$FF93,$FF8D,$FF88,$FF82,$FF7D,$FF78,$FF72,$FF6D
  1011.     DC.W    $FF68,$FF63,$FF5E,$FF59,$FF55,$FF50,$FF4B,$FF47,$FF43,$FF3F
  1012.     DC.W    $FF3B,$FF37,$FF33,$FF2F,$FF2C,$FF28,$FF25,$FF22,$FF1F,$FF1C
  1013.     DC.W    $FF19,$FF16,$FF14,$FF12,$FF0F,$FF0D,$FF0C,$FF0A,$FF08,$FF07
  1014.     DC.W    $FF05,$FF04,$FF03,$FF02,$FF02,$FF01,$FF01,$FF01,$FF00,$FF01
  1015.     DC.W    $FF01,$FF01,$FF02,$FF02,$FF03,$FF04,$FF05,$FF07,$FF08,$FF0A
  1016.     DC.W    $FF0C,$FF0D,$FF0F,$FF12,$FF14,$FF16,$FF19,$FF1C,$FF1F,$FF22
  1017.     DC.W    $FF25,$FF28,$FF2C,$FF2F,$FF33,$FF37,$FF3B,$FF3F,$FF43,$FF47
  1018.     DC.W    $FF4B,$FF50,$FF55,$FF59,$FF5E,$FF63,$FF68,$FF6D,$FF72,$FF78
  1019.     DC.W    $FF7D,$FF82,$FF88,$FF8D,$FF93,$FF99,$FF9F,$FFA4,$FFAA,$FFB0
  1020.     DC.W    $FFB6,$FFBC,$FFC2,$FFC8,$FFCF,$FFD5,$FFDB,$FFE1,$FFE7,$FFEE
  1021.     DC.W    $FFF4,$FFFA,$0000,$0006,$000C,$0012,$0019,$001F,$0025,$002B
  1022.     DC.W    $0031,$0038,$003E,$0044,$004A,$0050,$0056,$005C,$0061,$0067
  1023.     DC.W    $006D,$0073,$0078,$007E,$0083,$0088,$008E,$0093,$0098,$009D
  1024.     DC.W    $00A2,$00A7,$00AB,$00B0,$00B5,$00B9,$00BD,$00C1,$00C5,$00C9
  1025.     DC.W    $00CD,$00D1,$00D4,$00D8,$00DB,$00DE,$00E1,$00E4,$00E7,$00EA
  1026.     DC.W    $00EC,$00EE,$00F1,$00F3,$00F4,$00F6,$00F8,$00F9,$00FB,$00FC
  1027.     DC.W    $00FD,$00FE,$00FE,$00FF,$00FF,$00FF
  1028. ;--------------------------------------
  1029.  
  1030. nazwa    dc.b    'Workbench',0
  1031. screenname    dc.b    'kupa',0
  1032.